package com.huaxin.device.dto.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import com.huaxin.hxenum.base.BaseCodeEnum;
import lombok.Getter;

/**
 * 设备区域类型枚举 (Zone Type)
 * 用于定义建筑或设施内的物理区域分类
 * 如：电井、家庭房间、公共区域等，用于设备的空间归属管理
 */
@Getter
public enum DeviceZoneType implements BaseCodeEnum<String> {

    // -------------------- 电气专用空间 --------------------
    /**
     * 电井 (Electrical Shaft)
     * 建筑内用于集中敷设电气管线和设备的垂直通道
     * 通常包含配电箱、电缆、计量表等
     */
    ELECTRICAL_SHAFT("electrical_shaft", "电井"),

    /**
     * 配电室 (Electrical Room)
     * 安装有高低压配电柜、变压器等主要电力设备的独立房间
     * 是电力系统的核心节点
     */
    ELECTRICAL_ROOM("electrical_room", "配电室"),

    /**
     * 弱电井 (Telecom Shaft)
     * 用于敷设通信、网络、监控等弱电线路的垂直通道
     * 可能与电井合并或独立设置
     */
    TELECOM_SHAFT("telecom_shaft", "弱电井"),

    /**
     * 弱电间 (Telecom Room)
     * 集中管理通信、网络、安防等弱电设备的房间
     */
    TELECOM_ROOM("telecom_room", "弱电间"),

    // -------------------- 住宅/办公空间 --------------------
    /**
     * 客厅 (Living Room)
     * 住宅或公寓中的主要起居空间
     * 常见设备：智能插座、空调、照明、摄像头
     */
    LIVING_ROOM("living_room", "客厅"),

    /**
     * 卧室 (Bedroom)
     * 住宅或公寓中的休息空间
     * 常见设备：智能开关、温湿度传感器、窗帘电机
     */
    BEDROOM("bedroom", "卧室"),

    /**
     * 厨房 (Kitchen)
     * 住宅或公寓中的烹饪空间
     * 常见设备：烟雾探测器、燃气探测器、智能插座
     */
    KITCHEN("kitchen", "厨房"),

    /**
     * 卫生间 (Bathroom)
     * 住宅或公寓中的洗漱空间
     * 常见设备：水浸传感器、排风扇控制器、照明
     */
    BATHROOM("bathroom", "卫生间"),

    /**
     * 书房 (Study)
     * 住宅或公寓中的办公/学习空间
     * 常见设备：智能插座、照明、环境传感器
     */
    STUDY("study", "书房"),

    /**
     * 办公室 (Office)
     * 办公场所中的独立工作间
     */
    OFFICE("office", "办公室"),

    /**
     * 会议室 (Meeting Room)
     * 用于会议和讨论的公共空间
     * 常见设备：智能门锁、投影仪电源、环境传感器
     */
    MEETING_ROOM("meeting_room", "会议室"),

    // -------------------- 公共与辅助空间 --------------------
    /**
     * 楼道 (Corridor)
     * 连接各房间的公共走道
     * 常见设备：照明、烟雾探测器、摄像头
     */
    CORRIDOR("corridor", "楼道"),

    /**
     * 楼梯间 (Stairwell)
     * 建筑内的垂直交通空间
     * 常见设备：应急照明、烟雾探测器
     */
    STAIRWELL("stairwell", "楼梯间"),

    /**
     * 电梯厅 (Elevator Lobby)
     * 电梯出入口的等候区域
     */
    ELEVATOR_LOBBY("elevator_lobby", "电梯厅"),

    /**
     * 地下车库 (Basement Garage)
     * 位于地下的停车区域
     * 常见设备：车位传感器、照明、摄像头
     */
    BASEMENT_GARAGE("basement_garage", "地下车库"),

    /**
     * 设备间 (Equipment Room)
     * 存放非电气类设备（如水泵、空调主机）的房间
     */
    EQUIPMENT_ROOM("equipment_room", "设备间"),

    /**
     * 储藏室 (Storage Room)
     * 用于存放物品的房间
     */
    STORAGE_ROOM("storage_room", "储藏室");

    @EnumValue
    private final String code;
    private final String displayName;

    DeviceZoneType(String code, String displayName) {
        this.code = code;
        this.displayName = displayName;
    }

    @JsonValue
    @Override
    public String getCode() {
        return code;
    }

    @Override
    public String getDisplayName() {
        return displayName;
    }

    /**
     * 根据 code 获取对应的枚举实例
     *
     * @param code 区域类型代码 (如 "living_room", "kitchen", "electrical_shaft")
     * @return 对应的 DeviceZoneType 枚举，如果未找到则返回 null
     */
    public static DeviceZoneType of(String code) {
        for (DeviceZoneType type : values()) {
            if (type.getCode().equalsIgnoreCase(code) ||
                    type.getDisplayName().equalsIgnoreCase(code)) {
                return type;
            }
        }
        return null;
    }

    /**
     * 判断指定的 code 是否为有效的区域类型
     *
     * @param code 待验证的代码或名称
     * @return true 表示是有效的区域类型
     */
    public static boolean isValid(String code) {
        return of(code) != null;
    }

    /**
     * 判断该区域类型是否属于“住宅/办公空间”
     *
     * @return true 表示是房间类区域
     */
    public boolean isRoomType() {
        return this == LIVING_ROOM || this == BEDROOM || this == KITCHEN ||
                this == BATHROOM || this == STUDY || this == OFFICE ||
                this == MEETING_ROOM;
    }

    /**
     * 判断该区域类型是否属于“电气专用空间”
     *
     * @return true 表示是电力相关区域
     */
    public boolean isElectricalType() {
        return this == ELECTRICAL_SHAFT || this == ELECTRICAL_ROOM ||
                this == TELECOM_SHAFT || this == TELECOM_ROOM;
    }

    /**
     * 判断该区域类型是否属于“公共区域”
     *
     * @return true 表示是公共通行或共享空间
     */
    public boolean isPublicZone() {
        return this == CORRIDOR || this == STAIRWELL || this == ELEVATOR_LOBBY ||
                this == BASEMENT_GARAGE || this == MEETING_ROOM;
    }
}